Valid parenthesis string

Time: O(N); Space: O(1); medium

Given a string containing only three types of characters: ‘(’, ‘)’ and ‘*’, write a function to check whether this string is valid. We define the validity of a string by these rules: 1. Any left parenthesis ’(’ must have a corresponding right parenthesis ’)’. 2. Any right parenthesis ’)’ must have a corresponding left parenthesis ’(’. 3. Left parenthesis ’(’ must go before the corresponding right parenthesis ’)’. 4. ’*’ could be treated as a single right parenthesis ‘)’ or a single left parenthesis ‘(’ or an empty string. 5. An empty string is also valid.

Example 1:

Input: s = “()”

Output: True

Example 2:

Input: s = “(*)”

Output: True

Explanation:

  • ’*’ is empty.

Example 3:

Input: s = “(*))”

Output: True

Explanation:

  • use ’*’ as ‘(’.

Note:

  • The string size will be in the range [1, 100].

[1]:
class Solution1(object):
    def checkValidString(self, s):
        """
        :type s: str
        :rtype: bool
        """
        lower, upper = 0, 0  # keep lower bound and upper bound of '(' counts
        for c in s:
            lower += 1 if c == '(' else -1
            upper -= 1 if c == ')' else -1
            if upper < 0: break
            lower = max(lower, 0)
        return lower == 0  # range of '(' count is valid
[2]:
sol = Solution1()
s = "()"
assert sol.checkValidString(s) == True
s = "(*)"
assert sol.checkValidString(s) == True
s = "(*))"
assert sol.checkValidString(s) == True